House Price - Análise Exploratória de Dados
House Price - Análise Exploratória de Dados
1 Objetivos
- Qual o comportamento da variável resposta ?
- As proporções e distribuições das variáveis estão equilibradas nos dados de treino e teste ?
- Quais variáveis estão fortemente correlacionadas ?
- Qual a métrica usada para verificar a correlação ?
- Quais variáveis tem maior influência discriminatória sob a variável resposta.
- Para quais intervalos de determinadas variáveis tenho maior diferença no valor variável resposta ?
- Faz sentido discretizá-las ?
- Faz sentido agrupá-las ?
- Definindo o analytic-base-table (abt)
2 Conjuntos de dados
2.1 Dados de treinamento
df.train <- fread('../outputs/df.train.csv',
sep=",",
showProgress = FALSE)[,-1] %>%
data.frame(stringsAsFactors = T) %>%
select(Id,SalePrice,everything()) 3 Transformando o tipo das variáveis
Convertendo as variáveis tipo string em categóricas.
tipo <- lapply(df.train,class)
df.train[,unlist(tipo) != 'integer'] <- data.frame(apply(df.train[,unlist(tipo)!='integer'],2,factor))
df.train3.1 Dados de teste
df.test <- fread('../outputs/df.test.csv',sep=",",
showProgress = FALSE)[,-1] %>%
data.frame(stringsAsFactors = T)4 Transformando o tipo das variáveis
Convertendo as variáveis tipo string em categóricas.
tipo <- lapply(df.test,class)
df.test[,unlist(tipo) != 'integer'] <- data.frame(apply(df.test[,unlist(tipo)!='integer'],2,factor))
df.test5 A distribuição da variável resposta.
p0 <- ggdensity(df.train, x = "SalePrice",
fill = "#0073C2FF", color = "black",
add = "mean", rug = TRUE) +
labs(title = 'Distribuição da densidade da variável SalePrice') +
theme_dark()
p1 <- ggplot(df.train, aes(x = SalePrice)) +
geom_histogram(bins = 100,
color = "black",
fill = "#0073C2FF") +
labs(title = 'Distribuição de frequência da variável SalePrice') +
theme_dark()
gridExtra::grid.arrange(p0,p1,nrow = 1)Observe que há uma assimetria da distribuição do preço de venda com uma ascentuada cauda a direita. Ou seja, há poucos imóveis com preço muito de alto, o que é de se esperar, assim como há poucos imóveis com preço muito baixos. Essas variações do preço de venda devem estar relacionadas a fatores como:
- Imóveis de alto padrão
- Imóveis de médio padrão
- Imóveis de baixo padrão
E certamente entre as variáveis explicativas encontraremos as que discriminam essas variações.
6 Conjunto de Dados Equilibrados
Para que um modelo construído sobre os dados de treino garanta sua performance sobre os dados de teste, devemos nos preocurar em garantir que em ambos os conjuntos de dados exista um equilíbrio na distribuição e proporção de suas variáveis, caso contrário não há garantia quanto a performance, alías este é um dos grandes equívocos cometidos por muitas empresas.
Garantir que os dados existam dentro de um range faz parte da política data-drive de uma empresa que deseja ter sucesso em seus projetos de analytics.
7 Trabalhando com Dados do Tipo inteiro
df.train_int <- df.train[,unlist(lapply(df.train,is.integer))] %>%
select(-Id,-SalePrice)
df.test_int <- df.test[,unlist(lapply(df.test,is.integer))] %>%
select(-Id)7.1 Teste Kolmogorov Smirnov (KS)
O teste de kolmorov Smirnov, teste KS, é altamente recomendado para testar a hipótese de igualdade entre duas distribuições, pois retorna a distância média, estatística Dn, obtida de cada quantil das distribuições empírica dos dados.
Pensando na produtividades implementei o código abaixo que visa acelerar o processo de testar a igualdade entre as distribuições das variáveis.
7.1.1 Crio a matriz ks.mat
ks.mat <- matrix(NA,ncol = 3,nrow = 0,byrow = T)
colnames(ks.mat) <- c('variavel','dn','p_valor')7.1.2 Calculo as estatística do teste
for(var in names(df.test_int[,-1])){
# output do test ks
estat.ks <- ks.test(df.train_int[,var],df.test_int[,var])
# atribuição da estatistica Dn a variavel d
d <- as.numeric(unlist(round(estat.ks$statistic,4)))
# retorna o p-value em p
pv <- round(estat.ks$p.value,4)
# constrói a tabela ks.mat com as estatísticas obtidas
ks.mat <- rbind(ks.mat,c(variavel = var,dn = d ,p_valor = pv))
}considerando os números de linhas de nossas amostras o nível de significância da estatística Dn é dado por.
\[ \dfrac{1.36}{\sqrt{n}} \]
round(1.36/sqrt(nrow(df.train_int)),4)## [1] 0.0372
round(1.36/sqrt(nrow(df.test_int)),4)## [1] 0.0374
7.1.3 Construo um dataframe ordenado
data.frame(variavel = as.character(ks.mat[,1]),
dn = as.numeric(ks.mat[,2]),
p_valor = as.numeric(ks.mat[,3])) %>%
arrange(desc(dn))Esses resultados nos mostram que não há disferença estatística para todas as variáveis considerandos os conjuntos de dados de treino e teste, no entanto, os níveis de significância das variáveis X2ndFlrSF, GrLivArea, TotRmsAbvGrd e LotArea ficaram mais próximos do threshold 0.0374, iremos investigá-las.
7.2 Summary nas variáveis
df.train_int %>%
select(X2ndFlrSF,GrLivArea,
TotRmsAbvGrd,LotArea) %>%
summary ## X2ndFlrSF GrLivArea TotRmsAbvGrd LotArea
## Min. : 0.0 Min. : 438 Min. : 3.00 Min. : 1300
## 1st Qu.: 0.0 1st Qu.:1160 1st Qu.: 5.00 1st Qu.: 7744
## Median : 0.0 Median :1480 Median : 6.00 Median : 9600
## Mean : 357.1 Mean :1538 Mean : 6.55 Mean : 10706
## 3rd Qu.: 740.5 3rd Qu.:1792 3rd Qu.: 7.00 3rd Qu.: 11761
## Max. :2065.0 Max. :5642 Max. :12.00 Max. :215245
df.test_int %>%
select(X2ndFlrSF,GrLivArea,
TotRmsAbvGrd,LotArea) %>%
summary## X2ndFlrSF GrLivArea TotRmsAbvGrd LotArea
## Min. : 0.0 Min. : 407 Min. : 3.000 Min. : 1484
## 1st Qu.: 0.0 1st Qu.:1142 1st Qu.: 5.000 1st Qu.: 7430
## Median : 0.0 Median :1436 Median : 6.000 Median : 9512
## Mean : 330.9 Mean :1500 Mean : 6.385 Mean : 9763
## 3rd Qu.: 680.0 3rd Qu.:1730 3rd Qu.: 7.000 3rd Qu.:11556
## Max. :1862.0 Max. :5095 Max. :15.000 Max. :51974
Oberve que a variável LotArea no conjunto de treino possui um valor máximo de 215245 enquanto que no conjunto de teste seu valor máximo é 51974, essa variação modificou a posição das medianas nos conjuntos de dados, o que pode implicar em outliers e comprometer a performance do nosso futuro modelo preditivo.
7.2.1 Razão entre máximos
round(max(df.train_int$LotArea)/max(df.test_int$LotArea),2)## [1] 4.14
7.3 Plot ECDF para LotArea
A distribuição empírica acumulada (ecdf) nos ajuda a visualizar se há diferenças entre duas variáveis, por sorte no nosso caso não há.
ecdfplot(~ df.train_int$LotArea + df.test_int$LotArea,
auto.key=list(space='bottom',col = c('red','blue')),
col = c('red','blue'),
lwd = c(2,3),
xlab =" ",ylab = 'F(x)',
main = 'Distribuição Empírica Acumulada')Note que variável LotArea na amostra de treinamento tem valores extremos em relação a amostra de teste.
7.4 Boxplot para LotArea
boxplot(df.train_int$LotArea,
df.test_int$LotArea,
main = 'LotArea',
xlab = 'treino-teste')Existem quantos pontos da variável LotArea na amostra de treino são maiores que o ponto máximo na amostra de teste ?
df.train_int$LotArea[df.train_int$LotArea > max(df.test_int$LotArea)]## [1] 159000 215245 164660 53107 70761 53227 115149 53504 63887 57200
veja que são apenas 10 linhas em 1338, aproximadamente 0.75%, de modo que podemos remove-las sem comprometer o volume de dados.
7.4.1 Boxplot para o mesmo valor máximo
boxplot(df.train_int$LotArea[df.train_int$LotArea <= max(df.test_int$LotArea)],
df.test_int$LotArea,
main = 'LotArea',
xlab = 'treino-teste')variáveis com distruições equilibradas.
7.5 Boxplots para X2ndFlrSF
par(mfrow=c(1,2))
df.train_int %>%
select(X2ndFlrSF) %>%
boxplot(main = 'X2ndFlrSF',
xlab = 'amostra treino',
ylim = c(0,max(df.train_int$X2ndFlrSF)))
df.test_int %>%
select(X2ndFlrSF) %>%
boxplot(main = 'X2ndFlrSF',
xlab = 'amostra teste',
ylim = c(0,max(df.train_int$X2ndFlrSF)))7.6 Boxplots para GrLivArea
par(mfrow=c(1,2))
df.train_int %>%
select(GrLivArea) %>%
boxplot(main = 'GrLivArea',
xlab = 'amostra treino',
ylim = c(0,max(df.train_int$GrLivArea)))
df.test_int %>%
select(GrLivArea) %>%
boxplot(main = 'GrLivArea',
xlab = 'amostra teste',
ylim = c(0,max(df.train_int$GrLivArea)))7.7 Boxplots para TotRmsAbvGrd
par(mfrow=c(1,2))
df.train_int %>%
select(TotRmsAbvGrd) %>%
boxplot(main = 'TotRmsAbvGrd',
xlab = 'amostra treino',
ylim = c(0,max(df.train_int$TotRmsAbvGrd)))
df.test_int %>%
select(TotRmsAbvGrd) %>%
boxplot(main = 'TotRmsAbvGrd',
xlab = 'amostra teste',
ylim = c(0,max(df.train_int$TotRmsAbvGrd)))7.7.1 Removendo linhas no df.train
Como vimos temos apenas 10 linhas para serem removidas para variável LotAarea no conjunto de treino, ficamos um 1328 linhas em nosso df.train.
df.train <- df.train %>% filter(LotArea <= max(df.test_int$LotArea))8 Trabalhando com Dados do Tipo Categórico
df.train_fac <- df.train[,unlist(lapply(df.train,is.factor))]
df.test_fac <- df.test[,unlist(lapply(df.test,is.factor))] 8.1 Analisando a Distribuição das Proporções
Para analisar as proporções das classes em cada variável categórica, criei a função f.prop que me retorna o resumo do comparativo do número de cada classe da variável, suas porcentagens e a diferença percentual que cada classe possui em relação as amostras de treino e teste.
f.prop <- function(fac.train,fac.test,var){
proptrain <- count(fac.train,eval(parse(text = var))) %>%
arrange(desc(n)) %>%
mutate(perc.train = round(100*n/sum(n),2))
names(proptrain) <- c(var,'n.train','perc.train')
proptest <- count(fac.test,eval(parse(text = var))) %>%
arrange(desc(n)) %>%
mutate(perc.test = round(100*n/sum(n),2))
names(proptest) <- c(var,'n.test','perc.test')
df.prop <- left_join(proptrain,proptest, by = var)[,c(1,2,4,3,5)] %>%
mutate(dif.perc = perc.train-perc.test)
return(df.prop)
}Somente farei algum comentário caso perceba alguma discrepância nas proporções das classes de alguma variável.
8.1.1 Analise das Vars Categóricas
for(j in 1:5){
print(f.prop(df.train_fac,df.test_fac,names(df.train_fac)[j]))
cat('\n\n')
} ## # A tibble: 5 x 6
## MSZoning n.train n.test perc.train perc.test dif.perc
## <fct> <int> <int> <dbl> <dbl> <dbl>
## 1 RL 1056 1031 79.5 78.2 1.35
## 2 RM 191 205 14.4 15.5 -1.16
## 3 FV 62 69 4.67 5.23 -0.56
## 4 RH 11 9 0.83 0.68 0.150
## 5 C (all) 8 5 0.6 0.38 0.220
##
##
## # A tibble: 2 x 6
## Street n.train n.test perc.train perc.test dif.perc
## <fct> <int> <int> <dbl> <dbl> <dbl>
## 1 Pave 1324 1315 99.7 99.7 0
## 2 Grvl 4 4 0.3 0.3 0
##
##
## # A tibble: 4 x 6
## LotShape n.train n.test perc.train perc.test dif.perc
## <fct> <int> <int> <dbl> <dbl> <dbl>
## 1 Reg 829 820 62.4 62.2 0.25
## 2 IR1 455 461 34.3 35.0 -0.69
## 3 IR2 36 33 2.71 2.5 0.210
## 4 IR3 8 5 0.6 0.38 0.220
##
##
## # A tibble: 4 x 6
## LandContour n.train n.test perc.train perc.test dif.perc
## <fct> <int> <int> <dbl> <dbl> <dbl>
## 1 Lvl 1206 1184 90.8 89.8 1.05
## 2 Bnk 50 47 3.77 3.56 0.210
## 3 HLS 46 67 3.46 5.08 -1.62
## 4 Low 26 21 1.96 1.59 0.370
##
##
## # A tibble: 2 x 6
## Utilities n.train n.test perc.train perc.test dif.perc
## <chr> <int> <int> <dbl> <dbl> <dbl>
## 1 AllPub 1327 1319 99.9 100 -0.0800
## 2 NoSeWa 1 NA 0.08 NA NA
Veja que no conjunto de teste para a variável Utilities não há a classe NoSeWa e como há apenas uma linhas com essa classe no conjunto de treino, irei remove-lá.
for(j in 6:10){
print(f.prop(df.train_fac,df.test_fac,names(df.train_fac)[j]))
cat('\n\n')
}## # A tibble: 5 x 6
## LotConfig n.train n.test perc.train perc.test dif.perc
## <fct> <int> <int> <dbl> <dbl> <dbl>
## 1 Inside 954 977 71.8 74.1 -2.23
## 2 Corner 241 223 18.2 16.9 1.24
## 3 CulDSac 86 77 6.48 5.84 0.64
## 4 FR2 43 33 3.24 2.5 0.74
## 5 FR3 4 9 0.3 0.68 -0.38
##
##
## # A tibble: 3 x 6
## LandSlope n.train n.test perc.train perc.test dif.perc
## <fct> <int> <int> <dbl> <dbl> <dbl>
## 1 Gtl 1264 1258 95.2 95.4 -0.200
## 2 Mod 57 58 4.29 4.4 -0.11
## 3 Sev 7 3 0.53 0.23 0.3
##
##
## # A tibble: 25 x 6
## Neighborhood n.train n.test perc.train perc.test dif.perc
## <fct> <int> <int> <dbl> <dbl> <dbl>
## 1 NAmes 209 207 15.7 15.7 0.05
## 2 CollgCr 146 115 11.0 8.72 2.27
## 3 OldTown 100 103 7.53 7.81 -0.280
## 4 Somerst 83 87 6.25 6.6 -0.350
## 5 Gilbert 77 81 5.8 6.14 -0.340
## 6 NridgHt 75 88 5.65 6.67 -1.02
## 7 NWAmes 73 58 5.5 4.4 1.10
## 8 Edwards 69 71 5.2 5.38 -0.180
## 9 Sawyer 69 70 5.2 5.31 -0.110
## 10 SawyerW 53 54 3.99 4.09 -0.1000
## # ... with 15 more rows
##
##
## # A tibble: 9 x 6
## Condition1 n.train n.test perc.train perc.test dif.perc
## <fct> <int> <int> <dbl> <dbl> <dbl>
## 1 Norm 1154 1146 86.9 86.9 0.02
## 2 Feedr 61 66 4.59 5 -0.41
## 3 Artery 43 34 3.24 2.58 0.66
## 4 RRAn 26 21 1.96 1.59 0.370
## 5 PosN 19 20 1.43 1.52 -0.09
## 6 RRAe 10 13 0.75 0.99 -0.24
## 7 PosA 8 11 0.6 0.83 -0.23
## 8 RRNn 5 4 0.38 0.3 0.08
## 9 RRNe 2 4 0.15 0.3 -0.15
##
##
## # A tibble: 8 x 6
## Condition2 n.train n.test perc.train perc.test dif.perc
## <chr> <int> <int> <dbl> <dbl> <dbl>
## 1 Norm 1314 1305 99.0 98.9 0.01
## 2 Feedr 5 7 0.38 0.53 -0.15
## 3 Artery 2 2 0.15 0.15 0
## 4 PosN 2 2 0.15 0.15 0
## 5 RRNn 2 NA 0.15 NA NA
## 6 PosA 1 3 0.08 0.23 -0.15
## 7 RRAe 1 NA 0.08 NA NA
## 8 RRAn 1 NA 0.08 NA NA
Classes ausentes no conjunto de dados de teste:
- Condition2
- RRNn, RRAe e RRAn
for(j in 11:15){
print(f.prop(df.train_fac,df.test_fac,names(df.train_fac)[j]))
cat('\n\n')
}## # A tibble: 5 x 6
## BldgType n.train n.test perc.train perc.test dif.perc
## <fct> <int> <int> <dbl> <dbl> <dbl>
## 1 1Fam 1129 1109 85.0 84.1 0.940
## 2 TwnhsE 112 110 8.43 8.34 0.0900
## 3 Twnhs 38 48 2.86 3.64 -0.78
## 4 Duplex 28 32 2.11 2.43 -0.32
## 5 2fmCon 21 20 1.58 1.52 0.06
##
##
## # A tibble: 8 x 6
## HouseStyle n.train n.test perc.train perc.test dif.perc
## <chr> <int> <int> <dbl> <dbl> <dbl>
## 1 1Story 652 672 49.1 51.0 -1.85
## 2 2Story 423 393 31.8 29.8 2.05
## 3 1.5Fin 132 141 9.94 10.7 -0.75
## 4 SLvl 64 60 4.82 4.55 0.27
## 5 SFoyer 30 39 2.26 2.96 -0.7
## 6 1.5Unf 11 4 0.83 0.3 0.53
## 7 2.5Unf 10 10 0.75 0.76 -0.01
## 8 2.5Fin 6 NA 0.45 NA NA
##
##
## # A tibble: 6 x 6
## RoofStyle n.train n.test perc.train perc.test dif.perc
## <fct> <int> <int> <dbl> <dbl> <dbl>
## 1 Gable 1031 1052 77.6 79.8 -2.12
## 2 Hip 269 248 20.3 18.8 1.46
## 3 Flat 10 4 0.75 0.3 0.45
## 4 Gambrel 10 10 0.75 0.76 -0.01
## 5 Mansard 6 3 0.45 0.23 0.22
## 6 Shed 2 2 0.15 0.15 0
##
##
## # A tibble: 7 x 6
## RoofMatl n.train n.test perc.train perc.test dif.perc
## <chr> <int> <int> <dbl> <dbl> <dbl>
## 1 CompShg 1307 1306 98.4 99.0 -0.59
## 2 Tar&Grv 8 8 0.6 0.61 -0.01
## 3 WdShake 5 4 0.38 0.3 0.08
## 4 WdShngl 5 1 0.38 0.08 0.3
## 5 Membran 1 NA 0.08 NA NA
## 6 Metal 1 NA 0.08 NA NA
## 7 Roll 1 NA 0.08 NA NA
##
##
## # A tibble: 14 x 6
## Exterior1st n.train n.test perc.train perc.test dif.perc
## <chr> <int> <int> <dbl> <dbl> <dbl>
## 1 VinylSd 486 477 36.6 36.2 0.44
## 2 HdBoard 210 208 15.8 15.8 0.04
## 3 MetalSd 201 212 15.1 16.1 -0.930
## 4 Wd Sdng 181 172 13.6 13.0 0.59
## 5 Plywood 96 99 7.23 7.51 -0.280
## 6 CemntBd 51 57 3.84 4.32 -0.48
## 7 BrkFace 43 32 3.24 2.43 0.81
## 8 Stucco 20 14 1.51 1.06 0.450
## 9 WdShing 20 25 1.51 1.9 -0.390
## 10 AsbShng 15 19 1.13 1.44 -0.31
## 11 Stone 2 NA 0.15 NA NA
## 12 BrkComm 1 4 0.08 0.3 -0.220
## 13 CBlock 1 NA 0.08 NA NA
## 14 ImStucc 1 NA 0.08 NA NA
Classes ausentes no conjunto de dados de teste:
- HouseStyle
- 2.5Fin, remover 6 linhas
- 2.5Fin, remover 6 linhas
- RoofMatl
- Membran, Metal, Roll , remover 3 linhas
- Membran, Metal, Roll , remover 3 linhas
- Exterior1st
- Stone, CBlock, ImStucc , remover 3 linhas
for(j in 16:20){
print(f.prop(df.train_fac,df.test_fac,names(df.train_fac)[j]))
cat('\n\n')
}## # A tibble: 16 x 6
## Exterior2nd n.train n.test perc.train perc.test dif.perc
## <chr> <int> <int> <dbl> <dbl> <dbl>
## 1 VinylSd 475 474 35.8 35.9 -0.170
## 2 MetalSd 197 215 14.8 16.3 -1.47
## 3 HdBoard 195 186 14.7 14.1 0.58
## 4 Wd Sdng 175 167 13.2 12.7 0.520
## 5 Plywood 123 112 9.26 8.49 0.770
## 6 CmentBd 51 58 3.84 4.4 -0.56
## 7 Wd Shng 31 34 2.33 2.58 -0.25
## 8 Stucco 22 17 1.66 1.29 0.370
## 9 BrkFace 21 20 1.58 1.52 0.06
## 10 AsbShng 16 16 1.2 1.21 -0.01
## 11 ImStucc 10 5 0.75 0.38 0.37
## 12 Brk Cmn 6 15 0.45 1.14 -0.69
## 13 AsphShn 2 NA 0.15 NA NA
## 14 Stone 2 NA 0.15 NA NA
## 15 CBlock 1 NA 0.08 NA NA
## 16 Other 1 NA 0.08 NA NA
##
##
## # A tibble: 4 x 6
## MasVnrType n.train n.test perc.train perc.test dif.perc
## <fct> <int> <int> <dbl> <dbl> <dbl>
## 1 None 757 770 57 58.4 -1.38
## 2 BrkFace 431 422 32.4 32.0 0.46
## 3 Stone 126 120 9.49 9.1 0.39
## 4 BrkCmn 14 7 1.05 0.53 0.52
##
##
## # A tibble: 4 x 6
## ExterQual n.train n.test perc.train perc.test dif.perc
## <fct> <int> <int> <dbl> <dbl> <dbl>
## 1 TA 797 789 60.0 59.8 0.2
## 2 Gd 475 467 35.8 35.4 0.36
## 3 Ex 49 54 3.69 4.09 -0.400
## 4 Fa 7 9 0.53 0.68 -0.15
##
##
## # A tibble: 4 x 6
## ExterCond n.train n.test perc.train perc.test dif.perc
## <chr> <int> <int> <dbl> <dbl> <dbl>
## 1 TA 1173 1144 88.3 86.7 1.60
## 2 Gd 137 140 10.3 10.6 -0.290
## 3 Fa 16 26 1.2 1.97 -0.77
## 4 Ex 2 8 0.15 0.61 -0.46
##
##
## # A tibble: 5 x 6
## Foundation n.train n.test perc.train perc.test dif.perc
## <fct> <int> <int> <dbl> <dbl> <dbl>
## 1 PConc 617 619 46.5 46.9 -0.470
## 2 CBlock 573 551 43.2 41.8 1.38
## 3 BrkTil 129 144 9.71 10.9 -1.21
## 4 Stone 6 3 0.45 0.23 0.22
## 5 Wood 3 2 0.23 0.15 0.08
Classes ausentes no conjunto de dados de teste:
- Exterior2nd
- AsphShn, Stone, CBlock, Other
count(df.train_fac,ExterCond)count(df.test_fac,ExterCond)Na amostra de teste a classe Po da variável ExterCond não existe na amostra de treino.
for(j in 21:25){
print(f.prop(df.train_fac,df.test_fac,names(df.train_fac)[j]))
cat('\n\n')
}## # A tibble: 4 x 6
## BsmtQual n.train n.test perc.train perc.test dif.perc
## <fct> <int> <int> <dbl> <dbl> <dbl>
## 1 TA 592 585 44.6 44.4 0.230
## 2 Gd 585 561 44.0 42.5 1.52
## 3 Ex 119 131 8.96 9.93 -0.970
## 4 Fa 32 42 2.41 3.18 -0.77
##
##
## # A tibble: 4 x 6
## BsmtCond n.train n.test perc.train perc.test dif.perc
## <fct> <int> <int> <dbl> <dbl> <dbl>
## 1 TA 1227 1219 92.4 92.4 -0.03
## 2 Gd 62 53 4.67 4.02 0.65
## 3 Fa 38 46 2.86 3.49 -0.63
## 4 Po 1 1 0.08 0.08 0
##
##
## # A tibble: 4 x 6
## BsmtExposure n.train n.test perc.train perc.test dif.perc
## <fct> <int> <int> <dbl> <dbl> <dbl>
## 1 No 887 879 66.8 66.6 0.15
## 2 Av 211 183 15.9 13.9 2.02
## 3 Gd 119 139 8.96 10.5 -1.58
## 4 Mn 111 118 8.36 8.95 -0.590
##
##
## # A tibble: 6 x 6
## BsmtFinType1 n.train n.test perc.train perc.test dif.perc
## <fct> <int> <int> <dbl> <dbl> <dbl>
## 1 GLQ 399 414 30.0 31.4 -1.34
## 2 Unf 392 361 29.5 27.4 2.15
## 3 ALQ 205 201 15.4 15.2 0.200
## 4 BLQ 139 116 10.5 8.79 1.68
## 5 Rec 124 149 9.34 11.3 -1.96
## 6 LwQ 69 78 5.2 5.91 -0.71
##
##
## # A tibble: 6 x 6
## BsmtFinType2 n.train n.test perc.train perc.test dif.perc
## <fct> <int> <int> <dbl> <dbl> <dbl>
## 1 Unf 1169 1143 88.0 86.7 1.37
## 2 Rec 51 49 3.84 3.71 0.130
## 3 LwQ 46 41 3.46 3.11 0.35
## 4 BLQ 31 34 2.33 2.58 -0.25
## 5 ALQ 19 32 1.43 2.43 -1.
## 6 GLQ 12 20 0.9 1.52 -0.62
for(j in 26:30){
print(f.prop(df.train_fac,df.test_fac,names(df.train_fac)[j]))
cat('\n\n')
}## # A tibble: 4 x 6
## Heating n.train n.test perc.train perc.test dif.perc
## <chr> <int> <int> <dbl> <dbl> <dbl>
## 1 GasA 1309 1311 98.6 99.4 -0.82
## 2 GasW 15 8 1.13 0.61 0.520
## 3 Grav 3 NA 0.23 NA NA
## 4 OthW 1 NA 0.08 NA NA
##
##
## # A tibble: 5 x 6
## HeatingQC n.train n.test perc.train perc.test dif.perc
## <fct> <int> <int> <dbl> <dbl> <dbl>
## 1 Ex 699 704 52.6 53.4 -0.730
## 2 TA 376 370 28.3 28.0 0.260
## 3 Gd 216 213 16.3 16.2 0.12
## 4 Fa 36 31 2.71 2.35 0.360
## 5 Po 1 1 0.08 0.08 0
##
##
## # A tibble: 2 x 6
## CentralAir n.train n.test perc.train perc.test dif.perc
## <fct> <int> <int> <dbl> <dbl> <dbl>
## 1 Y 1267 1265 95.4 95.9 -0.5
## 2 N 61 54 4.59 4.09 0.5
##
##
## # A tibble: 5 x 6
## Electrical n.train n.test perc.train perc.test dif.perc
## <chr> <int> <int> <dbl> <dbl> <dbl>
## 1 SBrkr 1232 1224 92.8 92.8 -0.03
## 2 FuseA 76 75 5.72 5.69 0.0300
## 3 FuseF 17 17 1.28 1.29 -0.01
## 4 FuseP 2 3 0.15 0.23 -0.08
## 5 Mix 1 NA 0.08 NA NA
##
##
## # A tibble: 4 x 6
## KitchenQual n.train n.test perc.train perc.test dif.perc
## <fct> <int> <int> <dbl> <dbl> <dbl>
## 1 TA 647 663 48.7 50.3 -1.55
## 2 Gd 563 534 42.4 40.5 1.90
## 3 Ex 95 99 7.15 7.51 -0.360
## 4 Fa 23 23 1.73 1.74 -0.01
Classes ausentes no conjunto de dados de teste:
- Heating
- Grav, OthW
- Grav, OthW
- Electrical
- Mix
for(j in 31:35){
print(f.prop(df.train_fac,df.test_fac,names(df.train_fac)[j]))
cat('\n\n')
}## # A tibble: 7 x 6
## Functional n.train n.test perc.train perc.test dif.perc
## <chr> <int> <int> <dbl> <dbl> <dbl>
## 1 Typ 1247 1246 93.9 94.5 -0.570
## 2 Min2 30 27 2.26 2.05 0.210
## 3 Min1 26 27 1.96 2.05 -0.0900
## 4 Maj1 10 4 0.75 0.3 0.45
## 5 Mod 10 14 0.75 1.06 -0.31
## 6 Maj2 4 1 0.3 0.08 0.220
## 7 Sev 1 NA 0.08 NA NA
##
##
## # A tibble: 6 x 6
## GarageType n.train n.test perc.train perc.test dif.perc
## <fct> <int> <int> <dbl> <dbl> <dbl>
## 1 Attchd 844 813 63.6 61.6 1.91
## 2 Detchd 368 373 27.7 28.3 -0.57
## 3 BuiltIn 84 96 6.33 7.28 -0.95
## 4 Basment 19 17 1.43 1.29 0.140
## 5 CarPort 7 5 0.53 0.38 0.15
## 6 2Types 6 15 0.45 1.14 -0.69
##
##
## # A tibble: 3 x 6
## GarageFinish n.train n.test perc.train perc.test dif.perc
## <fct> <int> <int> <dbl> <dbl> <dbl>
## 1 Unf 577 588 43.4 44.6 -1.13
## 2 RFn 412 377 31.0 28.6 2.44
## 3 Fin 339 354 25.5 26.8 -1.31
##
##
## # A tibble: 5 x 6
## GarageQual n.train n.test perc.train perc.test dif.perc
## <chr> <int> <int> <dbl> <dbl> <dbl>
## 1 TA 1260 1240 94.9 94.0 0.870
## 2 Fa 48 68 3.61 5.16 -1.55
## 3 Gd 14 10 1.05 0.76 0.29
## 4 Ex 3 NA 0.23 NA NA
## 5 Po 3 1 0.23 0.08 0.15
##
##
## # A tibble: 5 x 6
## GarageCond n.train n.test perc.train perc.test dif.perc
## <fct> <int> <int> <dbl> <dbl> <dbl>
## 1 TA 1277 1276 96.2 96.7 -0.580
## 2 Fa 33 31 2.48 2.35 0.130
## 3 Gd 9 5 0.68 0.38 0.3
## 4 Po 7 6 0.53 0.45 0.08
## 5 Ex 2 1 0.15 0.08 0.0700
Classes ausentes no conjunto de dados de teste:
- Functional
- Sev
- Sev
- GarageQual
- Ex
for(j in 36:38){
print(f.prop(df.train_fac,df.test_fac,names(df.train_fac)[j]))
cat('\n\n')
}## # A tibble: 3 x 6
## PavedDrive n.train n.test perc.train perc.test dif.perc
## <fct> <int> <int> <dbl> <dbl> <dbl>
## 1 Y 1248 1217 94.0 92.3 1.71
## 2 N 53 73 3.99 5.53 -1.54
## 3 P 27 29 2.03 2.2 -0.17
##
##
## # A tibble: 9 x 6
## SaleType n.train n.test perc.train perc.test dif.perc
## <fct> <int> <int> <dbl> <dbl> <dbl>
## 1 WD 1149 1142 86.5 86.6 -0.06
## 2 New 116 106 8.73 8.04 0.69
## 3 COD 42 39 3.16 2.96 0.2
## 4 ConLD 6 11 0.45 0.83 -0.380
## 5 ConLI 4 4 0.3 0.3 0
## 6 ConLw 4 3 0.3 0.23 0.0700
## 7 CWD 4 8 0.3 0.61 -0.31
## 8 Con 2 3 0.15 0.23 -0.08
## 9 Oth 1 3 0.08 0.23 -0.15
##
##
## # A tibble: 6 x 6
## SaleCondition n.train n.test perc.train perc.test dif.perc
## <fct> <int> <int> <dbl> <dbl> <dbl>
## 1 Normal 1095 1103 82.4 83.6 -1.17
## 2 Partial 119 109 8.96 8.26 0.7
## 3 Abnorml 86 70 6.48 5.31 1.17
## 4 Family 20 25 1.51 1.9 -0.390
## 5 Alloca 7 7 0.53 0.53 0
## 6 AdjLand 1 5 0.08 0.38 -0.3
8.2 Resumindo as informações obtidas.
Quais as categorias que serão removidas de quais variáveis e amotras ?
- Condition2
- RRNn, RRAe e RRAn | df.train
- HouseStyle
- 2.5Fin | df.train
- 2.5Fin | df.train
- RoofMatl
- Membran, Metal, Roll | df.train
- Membran, Metal, Roll | df.train
- Exterior1st
- Stone, CBlock, ImStucc | df.train
- Stone, CBlock, ImStucc | df.train
- Exterior2nd
- AsphShn, Stone, CBlock, Other | df.train
- AsphShn, Stone, CBlock, Other | df.train
- ExterCond
- Po | df.test
- Heating
- Grav, OthW | df.train
- Grav, OthW | df.train
- Electrical
- Mix | df.train
- Functional
- Sev | df.train
- GarageQual
- Ex | df.train
9 Obtendo um novo df.train
Para remover os níveis das variáveis categóricas precisamos converte-las para o tipo string.
tipo <- lapply(df.train,class)
df.train[,unlist(tipo) != 'integer'] <-
data.frame(lapply(df.train[,unlist(tipo)!='integer'],function(x) as.character(unlist(x))), stringsAsFactors = F) 9.1 Filtrando linhas no df.train
df.train <- df.train %>%
filter(!(Condition2 %in% c('RRNn','RRAe','RRAn')),
!(HouseStyle %in% c('2.5Fin')),
!(RoofMatl %in% c('Membran','Metal','Roll')),
!(Exterior1st %in% c('Stone','CBlock','ImStucc')),
!(Exterior2nd %in% c('AsphShn','Stone','CBlock','Other')),
!(Heating %in% c('Grav','OthW')),
!(Electrical %in% c('Grav','OthW')),
!(Functional %in% c('Sev')),
!(GarageQual %in% c('Ex')))
df.train9.2 Filtrando linhas no df.test
df.test$ExterCond <- as.character(unlist(df.test$ExterCond))
df.test <- df.test %>% filter(ExterCond != 'Po')
df.test9.3 Exportando os data frames
write.csv(df.train,'../outputs/model.train.csv')
write.csv(df.test,'../outputs/model.test.csv')